package main

// 3. 无重复字符的最长子串

//func main() {
//	fmt.Printf("结果是%d", lengthOfLongestSubstring("abba"))
//}

func lengthOfLongestSubstring(s string) int {
	/*
		思路：滑动窗口
		1、定义起点与终点，一开始都在位置0
		2、定义一个记录每个字符最后位置的哈希桶
		3、终点不停地向后移动，当终点位置的字符已经在哈希桶中时，起点位置改为哈希桶中记录的位置+1，之后记录字符区间长度与更新当前字符最新的位置
	*/
	hash := map[byte]int{}
	sLen := len(s)
	start, ans := 0, 0
	var char byte
	var hashItem int
	var hasItem bool
	for end := 0; end < sLen; end++ {
		//println(string(s[i]))
		char = s[end]
		hashItem, hasItem = hash[char]
		//println(char, hashItem, hasItem, hash)
		if hasItem {
			start = max(start, hashItem+1)
		}
		hash[char] = end
		ans = max(ans, end-start+1)
	}
	return ans
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}
